package com.zkingsoft.common.redis;

import static org.springframework.util.Assert.notNull;

import java.util.Map;

import org.springframework.beans.factory.InitializingBean;

import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.matrix.core.tools.LogUtil;
import com.matrix.core.tools.StringUtils;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

/**
 * 
 * @author JIANGYOUYAO
 * @email 935090232@qq.com
 * @date 2018年1月25日
 */
public class RedisClient implements InitializingBean {

	/**
	 * redis服务器地址
	 */
	private String hostname;

	/**
	 * redis 访问端口
	 */
	private int port;

	/**
	 * 默认失效时间
	 */
	private int timeOut;

	private String password;

	private JedisPool jedisPool;// 非切片连接池

	/**
	 * 数据库标号
	 */
	private int database;

	private RedisClient() {
	}

	/**
	 * 保存一个对象，待超时时间
	 * 
	 * @author JIANGYOUYAO
	 * @email 935090232@qq.com
	 * @date 2018年1月19日
	 * @param key
	 * @param bean
	 * @param timeOut
	 */
	public void saveValue(String key, String value, int timeOut) {
		if (StringUtils.isNotBlank(value)) {
			Jedis jedis = getJedis();
			jedis.setex(key, timeOut, value);
			jedis.close();
		}
	}

	/**
	 * 删除一个对象
	 * 
	 * @author JIANGYOUYAO
	 * @email 935090232@qq.com
	 * @date 2018年1月19日
	 * @param key
	 */
	public void removeObject(String key) {
		Jedis jedis = getJedis();
		jedis.del(key);
		jedis.close();
	}

	/**
	 * 保存一个对象使用默认超时时间
	 * 
	 * @author JIANGYOUYAO
	 * @email 935090232@qq.com
	 * @date 2018年1月19日
	 * @param key
	 * @param bean
	 */
	public void saveValue(String key, Object jsonObject) {
		if (jsonObject != null) {
			Jedis jedis = getJedis();
			Gson g = new Gson();
			jedis.setex(key, timeOut, g.toJson(jsonObject));
			jedis.close();
		}
	}

	public void saveMapValue(String key, Map jsonObject) {
		if (jsonObject != null) {
			Jedis jedis = getJedis();
			Gson gson = new GsonBuilder().enableComplexMapKeySerialization().create();
			jedis.setex(key, timeOut, gson.toJson(jsonObject));
			jedis.close();
		}
	}

	public String getCachedValue(String key) {
		String value = "";
		Jedis jedis = null;
		try {
			jedis = getJedis();
			value = jedis.get(key);
		} catch (RuntimeException e) {
			LogUtil.error("获取redis 值 RuntimeException", e, "");
			if (jedis != null) {
				jedis.close();
			}
		} finally {
			if (jedis != null) {
				LogUtil.debug("释放jdedis 链接", jedis);
				jedis.close();
			}
		}
		return value;
	}

	/**
	 * bean创建后调用
	 */
	@Override
	public void afterPropertiesSet() throws Exception {
		// 校验参数
		notNull(hostname, "Property 'hostname' is required");
		notNull(port, "Property 'port' is required");
		JedisPoolConfig config = new JedisPoolConfig();
		config.setMaxIdle(100);
		config.setMaxTotal(1000);
		config.setMaxWaitMillis(3000L);
		config.setTestOnBorrow(false);
		// 每次释放链接的数目
		config.setNumTestsPerEvictionRun(20);

		jedisPool = new JedisPool(config, hostname, port, 3000, password, database);
	}

	private Jedis getJedis() {
		Jedis jedis = jedisPool.getResource();
		return jedis;
	}

	public String getHostname() {
		return hostname;
	}

	public void setHostname(String hostname) {
		this.hostname = hostname;
	}

	public int getPort() {
		return port;
	}

	public void setPort(int port) {
		this.port = port;
	}

	public int getTimeOut() {
		return timeOut;
	}

	public void setTimeOut(int timeOut) {
		this.timeOut = timeOut;
	}

	public int getDatabase() {
		return database;
	}

	public void setDatabase(int database) {
		this.database = database;
	}

	public String getPassword() {
		return password;
	}

	public void setPassword(String password) {
		this.password = password;
	}

}
